#include <mips/regdef.h>
#include <sys/syscall.h>

#define REG_RA	32
#define REG_FP	28
#define REG_GP	24

#define INWORD	20
#define PREV_CAR 16

#define SSIZE	40

#define ARG0	40
#define ARG1	44
	
	.text
	.align	2
	.globl	wc
	.ent	wc

wc:
	subu	sp,sp,SSIZE
	
	sw	ra,REG_RA(sp)	#Saved Registers Area.
	sw	$fp,REG_FP(sp)
	sw	gp,REG_GP(sp)
	move	$fp,sp

				#Argument building area.
	sw	a0,ARG0($fp)	#ARG0=fd
	sw	a1,ARG1($fp)	#ARG1=contadores

	move	t0,zero		#t0=zero
	sw	t0,INWORD($fp)	#en 20+fp vamos a tener nuestra variable que va a determinar si estamos en una palabra o no.
				#La inicializamos en 0 ---> inword=0

	la	t0, newline		#Cargamos la direccion del caracter newline en t0
	lbu	t1, 0(t0)		#Cargamos el caracter newline en t1
	sw	t1, PREV_CAR($fp)	#Inicializamos la variable que guardará el caracter anterior con el valor newline

loop_leer_car:
	li 	v0, SYS_read
	lw 	a0, ARG0($fp)	#a0=fd
	la 	a1, car_buf
	li 	a2, 1
	syscall

	bgtu 	a3, zero, hubo_error	
	beq 	v0, zero, fin_loop_leer_car

	la	t0, car_buf		#Cargamos la direccion del buffer de caracteres
	lb	t1, 0(t0)		#Tomamos el byte que corresponde al caracter
	sb	t1, PREV_CAR($fp)	#Lo guardamos en el Local & Temporary Area, para tener cual fue el caracter anterior

	lb	a0, PREV_CAR($fp)	#Cargo en el registro $a0 el caracter
	lw	a1, ARG1($fp)	#Cargo en el registro $a1 la direccion de los contadores
	lw	a2, INWORD($fp)	#Cargo en el registro $a2 inword

	la	t9, count
	jalr	t9

	sw	v0, INWORD($fp)	#Guardamos el resultado del count en inword

	b	loop_leer_car


fin_loop_leer_car:
	
	la	t2, newline	
	lbu	t3, 0(t2)		#Cargo el caracter newline en t3

	lbu	t2, PREV_CAR($fp)	#Cargo el ultimo caracter en t2

	beq	t2, t3, es_newline	#Chequeo si es un newline. Si no es un newline debo sumar a la cantidad de lineas
	
	lw	t4, ARG1($fp)		#Cargo la direccion del array
	lw	t5, 4(t4)		#t4=contadores[1]
	addiu	t5, t5, 1		#t4++
	sw	t5, 4(t4)		#contadores[0]=t4 O sea, estoy sumando a la cantidad de lineas

es_newline:

	li v0, 0			#Retornamos 0 para indicar ejecucion exitosa

fin_wc:

	move	sp,$fp
	lw	ra, REG_RA(sp)
	lw	$fp, REG_FP(sp)
	addiu	sp, sp, SSIZE
	jr	ra
	
hubo_error:
	move v0, a3
	b	fin_wc
	.end wc 

	.data
	newline: .ascii "\n"
	car_buf: .byte
